templates/cache
directory or performance will be drastically reduced.'
),
+ array(
+ 'category' => 'File permissions',
+ 'name' => getcwd() . '/tmp/cache',
+ 'result' => is_dir('tmp/cache') && is_writable('tmp/cache'),
+ 'required' => true,
+ 'message' => 'You must give vichan permission to write to the tmp/cache
directory.'
+ ),
array(
'category' => 'File permissions',
'name' => getcwd() . '/inc/instance-config.php',
@@ -758,17 +837,27 @@ if ($step == 0) {
'message' => 'vichan is still beta software and it\'s not going to come out of beta any time soon. As there are often many months between releases yet changes and bug fixes are very frequent, it\'s recommended to use the git repository to maintain your vichan installation. Using git makes upgrading much easier.'
)
);
-
+
$config['font_awesome'] = true;
+ $additional_config = array();
+ foreach ($tests as $test) {
+ if ($test['result'] && isset($test['effect'])) {
+ $test['effect']($additional_config);
+ }
+ }
+ $more = '';
+ create_config_from_array($more, $additional_config);
+ $_SESSION['more'] = $more;
+
echo Element('page.html', array(
'body' => Element('installer/check-requirements.html', array(
'extensions' => $extensions,
'tests' => $tests,
- 'config' => $config
+ 'config' => $config,
)),
'title' => 'Checking environment',
- 'config' => $config
+ 'config' => $config,
));
} elseif ($step == 2) {
// Basic config
@@ -779,14 +868,18 @@ if ($step == 0) {
echo Element('page.html', array(
'body' => Element('installer/config.html', array(
- 'config' => $config
+ 'config' => $config,
+ 'more' => $_SESSION['more'],
)),
'title' => 'Configuration',
'config' => $config
));
} elseif ($step == 3) {
+ $more = $_POST['more'];
+ unset($_POST['more']);
+
$instance_config =
-' $value) {
- if (is_array($value)) {
- $instance_config .= "\n";
- create_config_from_array($instance_config, $value, $prefix . '[\'' . addslashes($name) . '\']');
- $instance_config .= "\n";
- } else {
- $instance_config .= ' $config' . $prefix . '[\'' . addslashes($name) . '\'] = ';
-
- if (is_numeric($value))
- $instance_config .= $value;
- else
- $instance_config .= "'" . addslashes($value) . "'";
-
- $instance_config .= ";\n";
- }
- }
- }
-
create_config_from_array($instance_config, $_POST);
+ $instance_config .= "\n";
+ $instance_config .= $more;
$instance_config .= "\n";
if (@file_put_contents('inc/instance-config.php', $instance_config)) {
diff --git a/install.sql b/install.sql
index 969107a2..3b390645 100644
--- a/install.sql
+++ b/install.sql
@@ -65,6 +65,7 @@ CREATE TABLE IF NOT EXISTS `boards` (
`uri` varchar(58) CHARACTER SET utf8 NOT NULL,
`title` tinytext NOT NULL,
`subtitle` tinytext,
+ -- `indexed` boolean default true,
PRIMARY KEY (`uri`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
@@ -131,8 +132,8 @@ CREATE TABLE IF NOT EXISTS `modlogs` (
CREATE TABLE IF NOT EXISTS `mods` (
`id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(30) NOT NULL,
- `password` char(64) CHARACTER SET ascii NOT NULL COMMENT 'SHA256',
- `salt` char(32) CHARACTER SET ascii NOT NULL,
+ `password` varchar(256) CHARACTER SET ascii NOT NULL COMMENT 'SHA256',
+ `version` varchar(64) CHARACTER SET ascii NOT NULL,
`type` smallint(2) NOT NULL,
`boards` text CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`),
@@ -244,7 +245,7 @@ CREATE TABLE IF NOT EXISTS `search_queries` (
`ip` varchar(39) NOT NULL,
`time` int(11) NOT NULL,
`query` text NOT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
-- --------------------------------------------------------
@@ -296,6 +297,42 @@ CREATE TABLE IF NOT EXISTS `ban_appeals` (
KEY `ban_id` (`ban_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ;
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `pages`
+--
+
+CREATE TABLE `pages` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `board` varchar(255) DEFAULT NULL,
+ `name` varchar(255) NOT NULL,
+ `title` varchar(255) DEFAULT NULL,
+ `type` varchar(255) DEFAULT NULL,
+ `content` text,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `u_pages` (`name`,`board`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `nntp_references`
+--
+
+CREATE TABLE `nntp_references` (
+ `board` varchar(60) NOT NULL,
+ `id` int(11) unsigned NOT NULL,
+ `message_id` varchar(255) CHARACTER SET ascii NOT NULL,
+ `message_id_digest` varchar(40) CHARACTER SET ascii NOT NULL,
+ `own` tinyint(1) NOT NULL,
+ `headers` text,
+ PRIMARY KEY (`message_id_digest`),
+ UNIQUE KEY `message_id` (`message_id`),
+ UNIQUE KEY `u_board_id` (`board`, `id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
+
+
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
diff --git a/js/auto-scroll.js b/js/auto-scroll.js
new file mode 100644
index 00000000..b8343f5e
--- /dev/null
+++ b/js/auto-scroll.js
@@ -0,0 +1,27 @@
+$('document').ready(function () {
+ var autoScroll = localStorage['autoScroll'] ? true : false;
+ if (window.Options && Options.get_tab('general')){
+ Options.extend_tab('general','');
+ $('#autoScroll').find('input').prop('checked', autoScroll);
+ }
+ $('#autoScroll').on('change', function() {
+ if(autoScroll) {
+ delete localStorage.autoScroll;
+ } else {
+ localStorage.autoScroll = true;
+ }
+ autoScroll =! autoScroll
+ if(active_page == 'thread')
+ $('input.auto-scroll').prop('checked', autoScroll);
+ });
+ if (active_page == 'thread') {
+ $('span[id="updater"]').children('a').after(' ( Scroll to New posts)');
+ $('input.auto-scroll').prop('checked', autoScroll);
+ $(document).on('new_post', function (e, post) {
+ if ($('input.auto-scroll').prop('checked'))
+ {
+ scrollTo(0, $(post).offset().top - window.innerHeight + $(post).outerHeight(true));
+ }
+ });
+ }
+});
diff --git a/js/catalog-search.js b/js/catalog-search.js
index b3c9c49e..fc39b1ce 100644
--- a/js/catalog-search.js
+++ b/js/catalog-search.js
@@ -17,6 +17,21 @@ var catalogSearch = function() {
$threads = $('.threads .thread'),
$searchLabel = $(''),
$searchBox = $('');
+ function searchToggle() {
+ var button = $('#catalog_search_button');
+
+ if (!button.data('expanded')) {
+ button.data('expanded', '1');
+ button.text('Close');
+ $('.catalog_search').append(' ');
+ $('#search_field').focus();
+ } else {
+ button.removeData('expanded');
+ button.text('Search');
+ $('.catalog_search').children().last().remove();
+ $('div[id="Grid"]>.mix').each(function () { $(this).css('display', 'inline-block'); });
+ }
+ }
$controls.append($searchLabel)
.append($searchBox);
diff --git a/js/catalog.js b/js/catalog.js
index f64e22d4..9adaeaef 100644
--- a/js/catalog.js
+++ b/js/catalog.js
@@ -1,8 +1,16 @@
if (active_page == 'catalog') $(function(){
+ if (localStorage.catalog !== undefined) {
+ var catalog = JSON.parse(localStorage.catalog);
+ } else {
+ var catalog = {};
+ localStorage.catalog = JSON.stringify(catalog);
+ }
$("#sort_by").change(function(){
var value = this.value;
- $("#sort-"+value).trigger("click");
+ $('#Grid').mixItUp('sort', (value == "random" ? value : "sticky:desc " + value));
+ catalog.sort_by = value;
+ localStorage.catalog = JSON.stringify(catalog);
});
$("#image_size").change(function(){
@@ -11,7 +19,30 @@ if (active_page == 'catalog') $(function(){
$(".grid-li").removeClass("grid-size-small");
$(".grid-li").removeClass("grid-size-large");
$(".grid-li").addClass("grid-size-"+value);
+ catalog.image_size = value;
+ localStorage.catalog = JSON.stringify(catalog);
});
- $('#Grid').mixitup({});
+ $('#Grid').mixItUp({
+ animation: {
+ enable: false
+ }
+ });
+
+ if (catalog.sort_by !== undefined) {
+ $('#sort_by').val(catalog.sort_by).trigger('change');
+ }
+ if (catalog.image_size !== undefined) {
+ $('#image_size').val(catalog.image_size).trigger('change');
+ }
+
+ $('div.thread').on('click', function(e) {
+ if ($(this).css('overflow-y') === 'hidden') {
+ $(this).css('overflow-y', 'auto');
+ $(this).css('width', '100%');
+ } else {
+ $(this).css('overflow-y', 'hidden');
+ $(this).css('width', 'auto');
+ }
+ });
});
diff --git a/js/comment-toolbar.js b/js/comment-toolbar.js
new file mode 100644
index 00000000..51aa9808
--- /dev/null
+++ b/js/comment-toolbar.js
@@ -0,0 +1,383 @@
+/*
+ * comment-toolbar.js
+ * - Adds a toolbar above the commenting area containing most of 8Chan's formatting options
+ * - Press Esc to close quick-reply window when it's in focus
+ *
+ * Usage:
+ * $config['additional_javascript'][] = 'js/jquery.min.js';
+ * $config['additional_javascript'][] = 'js/comment-toolbar.js';
+ */
+if (active_page == 'thread' || active_page == 'index') {
+ var formatText = (function($){
+ "use strict";
+ var self = {};
+ self.rules = {
+ spoiler: {
+ text: _('Spoiler'),
+ key: 's',
+ multiline: false,
+ exclusiveline: false,
+ prefix:'**',
+ suffix:'**'
+ },
+ italics: {
+ text: _('Italics'),
+ key: 'i',
+ multiline: false,
+ exclusiveline: false,
+ prefix: "''",
+ suffix: "''"
+ },
+ bold: {
+ text: _('Bold'),
+ key: 'b',
+ multiline: false,
+ exclusiveline: false,
+ prefix: "'''",
+ suffix: "'''"
+ },
+ underline: {
+ text: _('Underline'),
+ key: 'u',
+ multiline: false,
+ exclusiveline: false,
+ prefix:'__',
+ suffix:'__'
+ },
+ code: {
+ text: _('Code'),
+ key: 'f',
+ multiline: true,
+ exclusiveline: false,
+ prefix: '[code]',
+ suffix: '[/code]'
+ },
+ strike: {
+ text: _('Strike'),
+ key: 'd',
+ multiline:false,
+ exclusiveline:false,
+ prefix:'~~',
+ suffix:'~~'
+ },
+ heading: {
+ text: _('Heading'),
+ key: 'r',
+ multiline:false,
+ exclusiveline:true,
+ prefix:'==',
+ suffix:'=='
+ }
+ };
+
+ self.toolbar_wrap = function(node) {
+ var parent = $(node).parents('form[name="post"]');
+ self.wrap(parent.find('#body')[0],'textarea[name="body"]', parent.find('.format-text > select')[0].value, false);
+ };
+
+ self.wrap = function(ref, target, option, expandedwrap) {
+ // clean and validate arguments
+ if (ref == null) return;
+ var settings = {multiline: false, exclusiveline: false, prefix:'', suffix: null};
+ $.extend(settings,JSON.parse(localStorage.formatText_rules)[option]);
+
+ // resolve targets into array of proper node elements
+ // yea, this is overly verbose, oh well.
+ var res = [];
+ if (target instanceof Array) {
+ for (var indexa in target) {
+ if (target.hasOwnProperty(indexa)) {
+ if (typeof target[indexa] == 'string') {
+ var nodes = $(target[indexa]);
+ for (var indexb in nodes) {
+ if (indexa.hasOwnProperty(indexb)) res.push(nodes[indexb]);
+ }
+ } else {
+ res.push(target[indexa]);
+ }
+ }
+ }
+ } else {
+ if (typeof target == 'string') {
+ var nodes = $(target);
+ for (var index in nodes) {
+ if (nodes.hasOwnProperty(index)) res.push(nodes[index]);
+ }
+ } else {
+ res.push(target);
+ }
+ }
+ target = res;
+ //record scroll top to restore it later.
+ var scrollTop = ref.scrollTop;
+
+ //We will restore the selection later, so record the current selection
+ var selectionStart = ref.selectionStart;
+ var selectionEnd = ref.selectionEnd;
+
+ var text = ref.value;
+ var before = text.substring(0, selectionStart);
+ var selected = text.substring(selectionStart, selectionEnd);
+ var after = text.substring(selectionEnd);
+ var whiteSpace = [" ","\t"];
+ var breakSpace = ["\r","\n"];
+ var cursor;
+
+ // handles multiline selections on formatting that doesn't support spanning over multiple lines
+ if (!settings.multiline) selected = selected.replace(/(\r|\n|\r\n)/g,settings.suffix +"$1"+ settings.prefix);
+
+ // handles formatting that requires it to be on it's own line OR if the user wishes to expand the wrap to the nearest linebreak
+ if (settings.exclusiveline || expandedwrap) {
+ // buffer the begining of the selection until a linebreak
+ cursor = before.length -1;
+ while (cursor >= 0 && breakSpace.indexOf(before.charAt(cursor)) == -1) {
+ cursor--;
+ }
+ selected = before.substring(cursor +1) + selected;
+ before = before.substring(0, cursor +1);
+
+ // buffer the end of the selection until a linebreak
+ cursor = 0;
+ while (cursor < after.length && breakSpace.indexOf(after.charAt(cursor)) == -1) {
+ cursor++;
+ }
+ selected += after.substring(0, cursor);
+ after = after.substring(cursor);
+ }
+
+ // set values
+ var res = before + settings.prefix + selected + settings.suffix + after;
+ $(target).val(res);
+
+ // restore the selection area and scroll of the reference
+ ref.selectionEnd = before.length + settings.prefix.length + selected.length;
+ if (selectionStart === selectionEnd) {
+ ref.selectionStart = ref.selectionEnd;
+ } else {
+ ref.selectionStart = before.length + settings.prefix.length;
+ }
+ ref.scrollTop = scrollTop;
+ };
+
+ self.build_toolbars = function(){
+ if (localStorage.formatText_toolbar == 'true'){
+ // remove existing toolbars
+ if ($('.format-text').length > 0) $('.format-text').remove();
+
+ // Place toolbar above each textarea input
+ var name, options = '', rules = JSON.parse(localStorage.formatText_rules);
+ for (var index in rules) {
+ if (!rules.hasOwnProperty(index)) continue;
+ name = rules[index].text;
+
+ //add hint if key exists
+ if (rules[index].key) {
+ name += ' (CTRL + '+ rules[index].key.toUpperCase() +')';
+ }
+ options += '';
+ }
+ $('[name="body"]').before('');
+ $('body').append('');
+ }
+ };
+
+ self.add_rule = function(rule, index){
+ if (rule === undefined) rule = {
+ text: 'New Rule',
+ key: '',
+ multiline:false,
+ exclusiveline:false,
+ prefix:'',
+ suffix:''
+ }
+
+ // generate an id for the rule
+ if (index === undefined) {
+ var rules = JSON.parse(localStorage.formatText_rules);
+ while (rules[index] || index === undefined) {
+ index = ''
+ index +='abcdefghijklmnopqrstuvwxyz'.substr(Math.floor(Math.random()*26),1);
+ index +='abcdefghijklmnopqrstuvwxyz'.substr(Math.floor(Math.random()*26),1);
+ index +='abcdefghijklmnopqrstuvwxyz'.substr(Math.floor(Math.random()*26),1);
+ }
+ }
+ if (window.Options && Options.get_tab('formatting')){
+ var html = $('').html('\
+ \
+ \
+ \
+ \
+ \
+ \
+ \
+ ');
+
+ if ($('.format_rule').length > 0) {
+ $('.format_rule').last().after(html);
+ } else {
+ Options.extend_tab('formatting', html);
+ }
+ }
+ };
+
+ self.save_rules = function(){
+ var rule, newrules = {}, rules = $('.format_rule');
+ for (var index=0;rules[index];index++) {
+ rule = $(rules[index]);
+ newrules[rule.attr('name')] = {
+ text: rule.find('[name="text"]').val(),
+ key: rule.find('[name="key"]').val(),
+ prefix: rule.find('[name="prefix"]').val(),
+ suffix: rule.find('[name="suffix"]').val(),
+ multiline: rule.find('[name="multiline"]').is(':checked'),
+ exclusiveline: rule.find('[name="exclusiveline"]').is(':checked')
+ };
+ }
+ localStorage.formatText_rules = JSON.stringify(newrules);
+ self.build_toolbars();
+ };
+
+ self.reset_rules = function(to_default) {
+ $('.format_rule').remove();
+ var rules;
+ if (to_default) rules = self.rules;
+ else rules = JSON.parse(localStorage.formatText_rules);
+ for (var index in rules){
+ if (!rules.hasOwnProperty(index)) continue;
+ self.add_rule(rules[index], index);
+ }
+ };
+
+ // setup default rules for customizing
+ if (!localStorage.formatText_rules) localStorage.formatText_rules = JSON.stringify(self.rules);
+
+ // setup code to be ran when page is ready (work around for main.js compilation).
+ $(document).ready(function(){
+ // Add settings to Options panel general tab
+ if (window.Options && Options.get_tab('general')) {
+ var s1 = '#formatText_keybinds>input', s2 = '#formatText_toolbar>input', e = 'change';
+ Options.extend_tab('general', '\
+ \
+ ');
+ } else {
+ var s1 = '#formatText_keybinds', s2 = '#formatText_toolbar', e = 'click';
+ $('hr:first').before('');
+ $('hr:first').before('');
+ }
+
+ // add the tab for customizing the format settings
+ if (window.Options && !Options.get_tab('formatting')) {
+ Options.add_tab('formatting', 'angle-right', _('Customize Formatting'));
+ Options.extend_tab('formatting', '\
+ \
+ ');
+
+ // Data control row
+ Options.extend_tab('formatting', '\
+ \
+ \
+ \
+ \
+ ');
+
+ // Descriptor row
+ Options.extend_tab('formatting', '\
+ Name\
+ ML\
+ EL\
+ Prefix\
+ Suffix\
+ Key\
+ ');
+
+ // Rule rows
+ var rules = JSON.parse(localStorage.formatText_rules);
+ for (var index in rules){
+ if (!rules.hasOwnProperty(index)) continue;
+ self.add_rule(rules[index], index);
+ }
+ }
+
+ // setting for enabling formatting keybinds
+ $(s1).on(e, function(e) {
+ console.log('Keybind');
+ if (!localStorage.formatText_keybinds || localStorage.formatText_keybinds == 'false') {
+ localStorage.formatText_keybinds = 'true';
+ if (window.Options && Options.get_tab('general')) e.target.checked = true;
+ } else {
+ localStorage.formatText_keybinds = 'false';
+ if (window.Options && Options.get_tab('general')) e.target.checked = false;
+ }
+ });
+
+ // setting for toolbar injection
+ $(s2).on(e, function(e) {
+ console.log('Toolbar');
+ if (!localStorage.formatText_toolbar || localStorage.formatText_toolbar == 'false') {
+ localStorage.formatText_toolbar = 'true';
+ if (window.Options && Options.get_tab('general')) e.target.checked = true;
+ formatText.build_toolbars();
+ } else {
+ localStorage.formatText_toolbar = 'false';
+ if (window.Options && Options.get_tab('general')) e.target.checked = false;
+ $('.format-text').remove();
+ }
+ });
+
+ // make sure the tab settings are switch properly at loadup
+ if (window.Options && Options.get_tab('general')) {
+ if (localStorage.formatText_keybinds == 'true') $(s1)[0].checked = true;
+ else $(s1)[0].checked = false;
+ if (localStorage.formatText_toolbar == 'true') $(s2)[0].checked = true;
+ else $(s2)[0].checked = false;
+ }
+
+ // Initial toolbar injection
+ formatText.build_toolbars();
+
+ //attach listener to so it also works on quick-reply box
+ $('body').on('keydown', '[name="body"]', function(e) {
+ if (!localStorage.formatText_keybinds || localStorage.formatText_keybinds == 'false') return;
+ var key = String.fromCharCode(e.which).toLowerCase();
+ var rules = JSON.parse(localStorage.formatText_rules);
+ for (var index in rules) {
+ if (!rules.hasOwnProperty(index)) continue;
+ if (key === rules[index].key && e.ctrlKey) {
+ e.preventDefault();
+ if (e.shiftKey) {
+ formatText.wrap(e.target, 'textarea[name="body"]', index, true);
+ } else {
+ formatText.wrap(e.target, 'textarea[name="body"]', index, false);
+ }
+ }
+ }
+ });
+
+ // Signal that comment-toolbar loading has completed.
+ $(document).trigger('formatText');
+ });
+
+ return self;
+ })(jQuery);
+}
diff --git a/js/expand-all-images.js b/js/expand-all-images.js
index 5545045c..c110f51c 100644
--- a/js/expand-all-images.js
+++ b/js/expand-all-images.js
@@ -23,7 +23,15 @@ onready(function(){
.text(_('Expand all images'))
.click(function() {
$('a img.post-image').each(function() {
- if (!$(this).parent()[0].dataset.expanded)
+ // Don't expand YouTube embeds
+ if ($(this).parent().parent().hasClass('video-container'))
+ return;
+
+ // or WEBM
+ if (/^\/player\.php\?/.test($(this).parent().attr('href')))
+ return;
+
+ if (!$(this).parent().data('expanded'))
$(this).parent().click();
});
@@ -34,8 +42,8 @@ onready(function(){
$('div#shrink-all-images a')
.text(_('Shrink all images'))
.click(function(){
- $('a img.post-image').each(function() {
- if ($(this).parent()[0].dataset.expanded)
+ $('a img.full-image').each(function() {
+ if ($(this).parent().data('expanded'))
$(this).parent().click();
});
$(this).parent().remove();
diff --git a/js/expand-too-long.js b/js/expand-too-long.js
index d6ea43af..bbadb5f1 100644
--- a/js/expand-too-long.js
+++ b/js/expand-too-long.js
@@ -17,7 +17,7 @@ $(function() {
e.preventDefault();
var url = $(this).attr('href');
- var body = $(this).parent().parent();
+ var body = $(this).parents('.body');
$.ajax({
url: url,
diff --git a/js/favorites.js b/js/favorites.js
index daf7b732..027dc243 100644
--- a/js/favorites.js
+++ b/js/favorites.js
@@ -50,7 +50,7 @@ function add_favorites() {
$('.boardlist').append(boards);
};
-if (active_page == 'thread' || active_page == 'index') {
+if (active_page == 'thread' || active_page == 'index' || active_page == 'catalog' || active_page == 'ukko') {
$(document).ready(function(){
var favorites = JSON.parse(localStorage.favorites);
var is_board_favorite = ~$.inArray(board_name, favorites);
diff --git a/js/file-selector.js b/js/file-selector.js
index 207a5ae9..c2b5381b 100644
--- a/js/file-selector.js
+++ b/js/file-selector.js
@@ -1,8 +1,9 @@
/*
- * file-selector.js - Add support for drag and drop file selection, and paste from clipbboard on supported browsers.
+ * file-selector.js - Add support for drag and drop file selection, and paste from clipboard on supported browsers.
*
* Usage:
* $config['additional_javascript'][] = 'js/jquery.min.js';
+ * $config['additional_javascript'][] = 'js/ajax.js';
* $config['additional_javascript'][] = 'js/file-selector.js';
*/
function init_file_selector(max_images) {
diff --git a/js/fix-report-delete-submit.js b/js/fix-report-delete-submit.js
index 73b6dd9c..f5cda9ad 100644
--- a/js/fix-report-delete-submit.js
+++ b/js/fix-report-delete-submit.js
@@ -1,26 +1,69 @@
/*
* fix-report-delete-submit.js
- * https://github.com/savetheinternet/Tinyboard/blob/master/js/fix-report-delete-submit.js
- *
- * Fixes a known bug regarding the delete/report submit buttons.
- *
- * Released under the MIT license
- * Copyright (c) 2012 Michael Save